import type {AxiosRequestConfig, AxiosResponse} from 'axios';

import type {RequestClient} from '../request-client';

class FileUploader {
    private client: RequestClient;

    constructor(client: RequestClient) {
        this.client = client;
    }

    public async upload(
        url: string,
        data: { file: Blob | File } & Record<string, any>,
        config?: AxiosRequestConfig,
    ): Promise<AxiosResponse> {
        const formData = new FormData();

        Object.entries(data).forEach(([key, value]) => {
            formData.append(key, value);
        });

        const finalConfig: AxiosRequestConfig = {
            ...config,
            headers: {
                'Content-Type': 'multipart/form-data',
                ...config?.headers,
            },
        };

        return this.client.post(url, formData, finalConfig);
    }
}

export {FileUploader};
